package code18_design.factory;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

// (多例)对象工厂
public class ObjectFactory2 {
	// 保存工厂可以创建的对象的Class
	private static Map<String, Class<?>> map = new HashMap<String, Class<?>>();
	
	static {
		// 加载配置文件 , 配置文件必须叫 objs.properties, 必须在 src 根目录下
		try (
				BufferedReader br = new BufferedReader(
						new InputStreamReader(
								ObjectFactory2.class.getClassLoader()
								.getResourceAsStream("objs.properties")
						));
				) {
			String line = null;
			while( ( line = br.readLine() ) != null ){
				String[] arr = line.split("=");
				if (arr.length == 2) {
					// 保留 key=value 格式的 内容
					String key = arr[0];
					String value = arr[1];
					// 加载对应的Class
					Class<?> clazz = Class.forName(value);
					map.put(key, clazz);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			// 静态代码块中不能抛出检查异常
			// 静态代码块专用异常
			throw new ExceptionInInitializerError("工厂初始化失败");
		}
	}
	
	/**
	 * 根据 key 获取 对应的对象
	 * @param key
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getObj(String key) {
		Class<?> c = map.get(key);
		T t = null;
		try {
			t = (T) c.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return t;
	}
	
}
